html css
2019-03-05
2019-03-05
一、px、em、rem的区别
- 1、px:
- px就是像素pixel,相对于显示器屏幕分辨率而言的,用px设置字体大小时,比较稳定和精确,设置多少就是多少。但是px不支持用户进行浏览器缩放或不同移动端的兼容,因为像素是固定的,屏幕大小是变化的,所以引入了em和rem。
- 特点:
- ①、IE无法调整那些使用px作为单位的字体大小;
- ②、国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位;
- ③、Firefox能够调整px和em,rem,但是目前国内使用IE浏览器(或内核)的用户占比重较大。
- 2、em:
- ①、浏览器的默认字体都是16px,那么1em=16px,以此类推计算12px=0.75em,10px=0.625em,2em=32px;
- ②、这样使用很复杂,很难很好的与px进行对应,也导致书写、使用、视觉的复杂(0.75em、0.625em全是小数点);
- ③、为了简化font-size的换算,我们在body中写入一下代码
body {font-size: 62.5%; } /* 公式16px*62.5%=10px */
- 这样页面中1em=10px,1.2em=12px,1.4em=14px,1.6em=16px,使得视觉、使用、书写都得到了极大的帮助。
- em的特点:
- ①、em的值并不是固定的;
- ②、em会继承父级元素的字体大小。
1
2
3
4
5
6
7
8
9
10
11
12<!--主要代码:-->
<style>
body{font-size: 62.5%;}
div{border:1px solid gray;font-size: 1.4em;}
</style>
<div class="out">
最外框
<div class="center">
中间框
<div class="in">最小框</div>
</div>
</div>
- 为什么会这样?
- 这主要是由于em的特性导致的。em中所有的字体都是相对于父元素的大小决定的;如果父级元素设置了
font-size:1.4em
,它的子元素也设置了font-size:1.4em
那么最后计算的结果是1.4X1.4=1.96em
,其它的依此类推。 - 因此,rem就是为了解决这些问题而出现的。
- 3、rem:
- 特点:
- ①、rem单位可谓集相对大小和绝对大小的优点于一身
- ②、和em不同的是rem总是相对于根元素(如:root{}),而不像em一样使用级联的方式来计算尺寸。这种相对单位使用起来更简单。
③、rem支持IE9及以上,意思是相对于根元素html(网页),不会像em那样,依赖于父元素的字体大小,而造成混乱,使用起来也好了很多。
跟em一样,网页默认1rem=16px,为了简化font-size的换算,我们在根元素html中加入
font-size: 62.5%;
- 即:
1rem=10px,1.2rem=12px,1.4rem=14px,1.6rem=16px……
1 | <!--主要代码:--> |
- 注意:
- ①:值得注意的浏览器支持问题: IE8,Safari 4或 iOS 3.2中不支持rem单位。
- ②:如果你的用户群都使用最新版的浏览器,那推荐使用rem,如果要考虑兼容性,那就使用px,或者两者同时使用,如
font-size:14px;font-size:1.4rem;
- ③:如果浏览器都支持,若项使用rem建议把rem的放在后面,因为css样式同级且冲突情况下以最后一个为准。
二、displasy:none、visibility:hidden、opacity:0 的区别
- 相同点:
- 1、都是从视觉上消失;
2、都会对子元素产生影响。
不同点:
- 1、displasy:none
- ①:不在文档流中占位,不占据空间,浏览器不解析该元素,但切换为display:block会产生回流、重排;
②:子元素不会被继承,但会影响所有的子元素。
2、visibility:hidden
- ①:仍占据空间,在文档流中仍旧存在;
- ②:会被子元素继承,但可以通过控制子元素来显示(visibility:visible;)、隐藏;
- ③:动态修改此属性会引起重绘;
④:不会触发该元素已经绑定的事件。
1
2
3
4
5
6
7
8
9
10
11<!--例子:-->
<style>
.out{width: 300px;height: 300px;background: blue;display: flex;align-items: center;justify-content: center;visibility: hidden;}
.in{width: 150px;height: 150px;background: red;visibility: visible;}
</style>
<div class="out">
<div class="in"></div>
</div>
<script>
document.getElementsByClassName('out')[0].onclick=()=>{alert(1)}
</script>这样会出现一个奇怪的现象:
- 明明父级元素已被隐藏了,但是点击子元素还是会被触发!来看一下浏览器的解析结果:
在js中虽然子元素能够继承了父元素的点击事件,但是父元素已被隐藏了,按理说是不能触发事件,但在此处,visibility:hidden只是从视觉上消失了,但在文档流中是仍然存在的,因此可以通过子元素触发父元素的事件。
3、opacity:0
- ①:只是透明度为100%,元素隐藏,从视觉上消失,但依然占据空间;
- ②:会被子元素继承,但是子元素并不能通过opacity=1,进行显示、隐藏;
- ③:依然能触发已经绑定的事件。